package main

import "fmt"

func main() {
	s1 := make([]byte, 1)        //任何低于8个字节的扩容后都是8个字节，不是简单的扩一倍。前提是放的下。
	fmt.Println(s1, "", cap(s1)) //1
	s1 = append(s1, 2)
	fmt.Println(s1, "", cap(s1)) //8

	s4 := []rune("hss")
	fmt.Println(s4, "", cap(s4)) //5
	s4 = append(s4, 'h')         //rune = int32 是4个字节
	fmt.Println(s4, "", cap(s4)) //12   按内存分配的规格，分配5*4*2=40 => 直接给48个字节的内存 （特殊），不只是单纯的扩容一倍

	s2 := []int{1, 2}
	s2 = append(s2, 3)        //int 8 个字节 8 * 2 *2 = 32  32 / 8 = 4 所以这个时候cap=4
	s2 = append(s2, 4)        //由于容量是4，目前只有3个，所以还放得下； 所以这个时候仍然cap=4
	s2 = append(s2, 5)        //由于目前4个容量已满， 需要扩容当前容量，按一倍 =>  8 * 4 * 2 = 64 ；总共需要64字节大小的内存； 64 / 8 = 8 个int大小的容量 所以下面输出8
	fmt.Println("=", cap(s2)) //输出8

	s3 := []int{1, 2, 3, 4}
	fmt.Println(s3, "", cap(s3))   //输出4
	s3 = append(s3, 3, 3, 3, 3, 3) //  4*8*2=64 64/8 = 8不够同时放入5个数,所以就按（4+1）*8*2=80个字节 80 / 8 = 10 个int容量  (特殊)
	fmt.Println("=", cap(s3))      //输出10

	s5 := []string{"hello"}
	fmt.Println(cap(s5))                          //输出1
	s5 = append(s5, "world")                      //string是16个字节单位 16*2 = 32  32/16 = 2
	fmt.Println(cap(s5))                          //输出2
	s5 = append(s5, "!")                          //16 * 2 * 2 = 64  64 /16 = 4
	fmt.Println(cap(s5))                          //输出4
	s5 = append(s5, "渺", "!", "!", "!", "!", "!") //当同时append多个数据超出 容量*2 的时候 ，容量按 按一倍扩容后超出多少个加多少个16字节的内存  (特殊）
	fmt.Println(cap(s5))                          //扩容一倍=8，不够放还差1个，所以输出9，append再加cap也再加

}
